<?php
class Tools_Model_Image extends Promotor_Model_Abstract
{
	/**
	 * @var KontorX_Image
	 */
	protected $_image;

	public function __construct($image) 
	{
		$f = new Zend_Filter_RealPath();
		$image = $f->filter($image);

		try 
		{
			$this->_image = new KontorX_Image($image);
			$this->_setStatus(self::SUCCESS);
		} catch(KontorX_Image_Exception $e) {
			$this->_addException($e);
			$this->_setStatus(self::FAILURE);
		}
	}

	public function setActions(array $options)
	{
		foreach ($options as $name => $value)
		{
			$method = 'image' . ucfirst($name);
			if (method_exists($this, $method))
			{
				$this->$method($value);
			}
		}
	}

	/**
	 * @param float $angle
	 * @return void
	 */
	public function imageRotate($angle)
	{
		$this->_image->rotate($angle);
	}
	
	public function imageMaxWidth($width)
	{
		if (is_numeric($width))
		{
			$this->_image->resizeToMaxWidth($width);
		}
	}
	
	public function imageMaxHeight($height)
	{
		if (is_numeric($height))
		{
			$this->_image->resizeToMaxHeight($height);
		}
	}
	
	/**
	 * @param array|string $argument
	 * @return void
	 */
	public function imageCrop($argument)
	{
		if (empty($argument)) {
			return;
		}

		if (is_string($argument))
		{
			$argument = urldecode($argument);
			$argument = explode(':',$argument);
		}

		if (!is_array($argument) || count($argument) != 4) 
		{
			$this->_addMessage('nie podano danych do przycięcia fotografii');
			return;
		}

		foreach ($argument as $val)
		{
			if (!is_numeric($val))
			{
				return;
			}
		}

		@list($offsetWidth, $offsetHeight, $width, $height) = $argument; 
		$this->_image->crop($offsetWidth, $offsetHeight, $width, $height);
	}
	
	public function display()
	{
		$image = $this->_image->display();
	}

	public function save()
	{
		if ($this->_upload())
		{
			// podmieniana jest fotografia
		} else {
			// zapisuj zawsze w najwyższej jakości!
			$image = $this->_image->save(null, null, 100);
		}

		$this->_unlinkThumbs();
	}
	
	public function _upload()
	{
		$fileName = 'file';

		$file = new Zend_File_Transfer_Adapter_Http();
		$file->addFilter(
			'Rename',
			array(
				'target' => $this->_image->getPathname(),
				'overwrite' => true
			), 
			$fileName
		);

		try {
			$result = $file->receive($fileName);
		} catch(Exception $e) {
			$this->_addException($e);
			return false;
		}

		if(!$result) {
			$this->_addMessages($file->getErrors());
		}
		
		return $result;
	}
	
	/**
	 * Usuń pliki o identycznej nazwie które są w podktalogach
	 * 
	 * Ta funkcja ma send tylko dla wszystkich plików graficznych 
	 * modyfikowanych poprzez image.php
	 * 
	 * @return void
	 */
	protected function _unlinkThumbs()
	{
		$pathname = $this->_image->getPathname();

		$pattern = dirname($pathname) . '/*/' . basename($pathname);
		foreach (glob($pattern) as $file)
		{
			if (is_file($file))
			{
				if (!@unlink($file))
				{
					$this->_addMessage(sprintf('nie usunięto pliku: %s', $file));
				}
			}
		}
	}
}